package com.ce.common.db.handler.impl;

import java.util.ArrayList;
import java.util.List;

import com.ce.common.db.base.DBConnection;
import com.ce.common.db.base.DataObject;
import com.ce.common.db.handler.TableHandler;

/**
 * mysql数据库处理表的具体实现类
 * @author yangenxiong
 *
 */
public class MySQLTableHandler implements TableHandler {

	private DBConnection conn;
	
	public MySQLTableHandler() {
		
	}
	
	public MySQLTableHandler(DBConnection conn) {
		this.conn = conn;
	}
	
	public void setDBConnection(DBConnection conn) {
		this.conn = conn;
	}
	
	public DBConnection getDBConnection() {
		return this.conn;
	}
	
	/**
	 * 根据参数talbes, 删除这些表, 如果其中一个表删除失败, 则所有表都删除失败
	 * @author yangenxiong
	 * @param tables 需要删除的表的对象
	 * @return true 删除成功 false 删除失败
	 */
	public boolean dropTables(List<DataObject> tables) {
		boolean result = true;
		try {
			dropConstraint();//先删除所有的关联
			List<String> sql = new ArrayList<String>();
			for (DataObject obj : tables) {
				sql.add(new StringBuffer("drop " + obj.getType() + " " + obj.getName()).toString());
			}
			result = conn.execute(sql);
			revertConstraint();//再恢复关联
		} catch (Exception e) {
			e.printStackTrace();
			result = false;
		}
		return result;
	}
	
	/**
	 * 删除talbes集合中表里面的数据, 如果不忽略表关系, 则其中一个表的数据删除失败, 则所有表的数据都删除失败
	 * @param tables 需要删除的表的对象
	 * @param ignoreConstraint 是否忽略关联关系 true为忽略 false为不忽略
	 * @return
	 */
	public boolean deleteRecord(List<DataObject> tables, boolean ignoreConstraint) {
		boolean result = true;
		try {
			if (ignoreConstraint == true) {//忽略关系
				dropConstraint();
			}
			result = deleteRecord(tables);
			revertConstraint();
		} catch (Exception e) {//删除关联和建立关联时出异常
			e.printStackTrace();
		}

		return result;
	}
	
	/**
	 * 用于删除表的数据
	 * @author yangenxiong
	 * @param tables 需要删除数据的表的对象集合
	 * @return
	 */
	private boolean deleteRecord(List<DataObject> tables) {
		List<String> sql = new ArrayList<String>();
		for (DataObject obj : tables) {
			if (obj.getType().equalsIgnoreCase("table")) {//只删除表里的数据
				sql.add(new StringBuffer("delete from " + obj.getName()).toString());
			}
		}
		return conn.execute(sql);
	}
	
	/**
	 * 删除数据库中表或者视图之间的关联
	 * @throws Exception
	 */
	public void dropConstraint() throws Exception {
		conn.execute("SET FOREIGN_KEY_CHECKS=0;");
	}

	/**
	 * 恢复数据库中表或者视图之间的关联
	 * @throws Exception
	 */
	public void revertConstraint() throws Exception {
		conn.execute("SET FOREIGN_KEY_CHECKS=1;");
	}
}
